home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
demos
/
exsyslib
/
examples
/
example3.s
< prev
next >
Wrap
Text File
|
1980-01-03
|
5KB
|
240 lines
*****************************************************************************
* 3D-Star routine - Using the 'exsys.library' startup routines...
* --------------------------------------------------------------------------
* This entire 3d-demo routine when using the 'exsys.library' routines takes
* up only 908 bytes of diskspace UNCOMPRESSED!!!!
*****************************************************************************
PlaneHeight = 255
PlaneWidth = 40
PlaneLen = PlaneHeight*PlaneWidth
PL = PlaneLen
PlaneBLTSIZE = 3*PlaneHeight*64+(PlaneWidth/2)
MaxTiefe = $2000
StarCount = 335
X = 160
Y = 160
Z = 256
ClipX = 319
ClipY = 254
movespeed = 5
section example,code_c
*-------------- Were including the 'exsys.library' startup call here.
include 'work:exsyslib/include/hardware/exsys_takeover.s'
*-------------- end of startup routine calls...
bsr.b InitStars
lea NCList(pc),a0
bsr.b newcopper
Main: cmpi.b #255,$dff006
bne.s Main
bsr.w movestars
bsr.w ChangePlanes
btst #6,$bfe001
bne.s Main
rts
newcopper: lea $dff000,a6 ;a6=custom hardware
move.w #$7fff,$96(a6) ;no dma
move.l a0,$80(a6) ;install new copperlist ptr
clr.w $88(a6) ;strobe copper
move.w #$83c0,$96(a6) ;enable copper dma
rts
InitStars lea StarDatas,a0
move.w #$1fff,d3
move.w #StarCount-1,d7
.Loop: bsr.b GetWord ;X Word
add.w #X,d2
and.w d3,d2
sub.w #X,d2
move.w d2,(a0)+
bsr.b GetWord ;Y Word
add.w #Y,d2
and.w d3,d2
sub.w #Y,d2
move.w d2,(a0)+
bsr.b GetWord ;Z Word
add.w #Z,d2
and.w d3,d2
sub.w #Z,d2
move.w d2,(a0)+
dbf d7,.Loop
lea YTab,a0 ; calc table
moveq #0,d0
move.w #PlaneHeight-1,d7
.Looop: move.w d0,(a0)+
add.w #PlaneWidth,d0
dbra d7,.Looop
lea PerspTab,a1 ;build division table
move.w #Z,d0
add.w d0,a1
add.w d0,a1
move.w #Z,d2
mulu #$7fff,d2
.Loop2: move.l d2,d1
divu d0,d1
move.w d1,(a1)+
addq.w #1,d0
cmp.w #MaxTiefe,d0
bne.s .Loop2
rts
GetWord: bsr.s GetByte
move.b d0,d2
lsl.w #8,d2
bsr.s GetByte
move.b d0,d2
rts
GetByte: move.b $dff007,d0
move.b $bfd800,d1
eor.b d1,d0
moveq #0,d1
move.b d0,d1
ror.b #1,d1
.loop: dbf d1,.loop
rts
ChangePlanes: lea Plane(pc),a0
movem.l (a0),d0-d2
exg d0,d1
exg d1,d2
movem.l d0-d2,(a0)
lea PlanePtrs(pc),a0
move.w d0,6(a0)
swap d0
move.w d0,2(a0)
swap d0
add.l #PlaneLen,d0
move.w d0,6+8(a0)
swap d0
move.w d0,2+8(a0)
swap d0
add.l #PlaneLen,d0
move.w d0,6+16(a0)
swap d0
move.w d0,2+16(a0)
swap d0
rts
movestars lea $dff000,a6
BlitWait btst #6,$02(a6) ; wait till blitter free
bne.s BlitWait
move.l DelPlane(pc),$54(a6)
clr.w $66(a6)
move.l #$01000000,$40(a6)
move.w #PlaneBLTSIZE,$58(a6) ; clear screen memory
move.w #StarCount-1,d7 ;64 Stars
lea StarDatas,a0 ;Ptr StarDatas
lea PerspTab,a1 ;Projection Table
movem.w XAdd(pc),a4-a6 ;Put coordinate adds in regs
move.w #ClipX,a3 ;Clipping constante
move.w #ClipY,d5
move.w #$1fff,d3
move.w #$1000,d4 ;middle value
add.w d4,a4 ;+x add
add.w d4,a5 ;+y add
.Loop: movem.w (a0),d0-d2 ;Get coordinate
add.w a4,d0 ;add middle and de/increase x
and.w d3,d0 ;check overflow
sub.w d4,d0 ;sub middle
add.w a5,d1 ;add middle and de/increase y
and.w d3,d1 ;check overflow
sub.w d4,d1 ;sub middle
add.w a6,d2 ;de/increase z
and.w d3,d2 ;check overflow
movem.w d0-d2,(a0) ;save coords
addq.w #6,a0 ;(there is no movem.w d0,(a0)+)
.SetStar: cmp.w #Z,d2 ;z<d2?
blt.s .Next ;-> Next star
add.w d2,d2 ;Z*2
move.w (a1,d2.w),d6 ;Projektionswert holen
muls d6,d0 ;projection
swap d0 ;
add.w #X,d0 ;X middle of screen (160)
cmp.w a3,d0 ;a3=ClipX (Clipping)
bhi.s .Next ;Don't plot
muls d6,d1 ;projection
swap d1
add.w #Y,d1 ;Y middle of screen (128)
cmp.w d5,d1 ;a4=ClipY
bhi.s .Next ;Don't plot
move.l WorkPlane(pc),a2 ;plot pixel
move.w d0,d6
lsr.w #3,d6
add.w d6,a2
add.w d1,d1
move.l a5,-(sp)
lea YTab,a5
add.w (a5,d1.w),a2
move.l (sp)+,a5
not.w d0
rol.w #6,d2 ;get color
and.w #$e,d2
move.w .JT(pc,d2.w),d2
jmp .JT(pc,d2.w)
.JT: dc.w .r6-.JT,.r6-.JT,.r5-.JT,.r4-.JT
dc.w .r3-.JT,.r2-.JT,.r1-.JT,.r0-.JT
.r0: bset d0,(a2) ;plot routines...
.next: dbf d7,.Loop
rts
.r1: bset d0,PL(a2)
dbf d7,.Loop
rts
.r2: bset d0,(a2)
bset d0,PL(a2)
dbf d7,.Loop
rts
.r3: bset d0,PL*2(a2)
dbf d7,.Loop
rts
.r4: bset d0,(a2)
bset d0,PL*2(a2)
dbf d7,.Loop
rts
.r5: bset d0,PL(a2)
bset d0,PL*2(a2)
dbf d7,.Loop
rts
.r6: bset d0,(a2)
bset d0,PL(a2)
bset d0,PL*2(a2)
dbf d7,.Loop
rts
NCList: dc.l $01200000,$01220000,$01240000,$01260000
dc.l $01280000,$012a0000,$012c0000,$012e0000
dc.l $01300000,$01320000,$01340000,$01360000
dc.l $01380000,$013a0000,$013c0000,$013e0000
dc.l $008e2c81,$00902bc1,$00920038,$009400d0
dc.l $01020000,$01040000,$01080000,$010a0000
dc.l $01000200
PlanePtrs: dc.l $00e00000,$00e20000,$00e40000,$00e60000
dc.l $00e80000,$00ea0000
dc.l $01003200
dc.l $01800000,$01820333,$01840555,$01860777
dc.l $01880999,$018a0bbb,$018c0ddd,$018e0fff
dc.l -2
XAdd: dc.w 0
YAdd: dc.w 0
ZAdd: dc.w 100
Plane: dc.l Plane1
WorkPlane: dc.l Plane2
DelPlane: dc.l Plane3
section b,bss_c
Plane1: ds.b PlaneLen*3
Plane2: ds.b PlaneLen*3
Plane3: ds.b PlaneLen*3
PerspTab: ds.w MaxTiefe
StarDatas: ds.w StarCount*3
YTab: ds.w PlaneHeight